package com.lvmama.rhino.job;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import com.lvmama.rhino.entity.PageMonitorVO;
import com.lvmama.rhino.mapper.PageMonitorMapper;
import com.lvmama.rhino.pojo.PageMonitorInfo;
import com.lvmama.rhino.service.PageMonitorService;
import com.lvmama.rhino.service.impl.ElasticsearchIndexService;
import com.lvmama.rhino.utils.Constants;
import com.lvmama.rhino.utils.DateUtil;

public class H5PageMonitorJob extends BaseQuartzJobBean{
    
    private static final Logger logger = Logger.getLogger(H5PageMonitorJob.class);
    
    @Autowired
    private ElasticsearchIndexService service;
    
    @Override
    public void invoke(JobExecutionContext context) {
        ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()
            .get("applicationContext");
        PageMonitorService pageMonitorService = applicationContext.getBean(PageMonitorService.class);
        PageMonitorMapper pageMonitorMapper = applicationContext.getBean(PageMonitorMapper.class);
        Date date = new Date();
        String dateStr = DateUtil.getStrDayOfMonth(date, 7, "yyyyMMdd");
        String result = pageMonitorMapper.queryPartition("part_" + dateStr);
        if(result == null){
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("dateStr", "part_" + dateStr);
            param.put("str", "'"+dateStr+"'");
            pageMonitorService.createPartition(param);
            logger.info("新建part_"+dateStr+"分区成功");
        }else{
            logger.info("part_"+dateStr+"分区已存在");
        }
        logger.info("h5首屏时间定时任务启动");
        PageMonitorVO pageMonitorVO = getPageMonitorVO();//返回前七天的日期
        /*PageMonitorVO pageMonitorVO = new PageMonitorVO();
        pageMonitorVO.setChooseTimeVO("12/26/2016 - 12/29/2016");
        if(pageMonitorVO.getChooseTimeVO()!=null){
            String[] split = pageMonitorVO.getChooseTimeVO().split("-");
            DateTimeFormatter formater = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
            Date startDate = DateTime.parse(split[0].trim()+ " 00:00:00", formater).toDate();
            Date endDate = DateTime.parse(split[1].trim()+ " 23:59:59", formater).toDate();
            pageMonitorVO.setStart_date(startDate);
            pageMonitorVO.setEnd_date(endDate);
        }else{
            pageMonitorVO.setStart_date(null);
            pageMonitorVO.setEnd_date(null);
        }*/
        
        //List<PageMonitor> pageMonitorList = pageMonitorService.queryTimePageMonitorList(pageMonitorVO);//根据条件查询所有数据信息
        //根据条件查询加载时段为0s-1s所有数据信息
        List<PageMonitorInfo> pageMonitorInfoList = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        pageMonitorVO.setMinTime(0.0);
        pageMonitorVO.setMaxTime(1.0);
        //根据条件查询加载时段为1s-2s所有数据信息
        List<PageMonitorInfo> pageMonitorInfoList1 = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        pageMonitorVO.setMinTime(1.0);
        pageMonitorVO.setMaxTime(2.0);
        //根据条件查询加载时段为2s-3s所有数据信息
        List<PageMonitorInfo> pageMonitorInfoList2 = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        pageMonitorVO.setMinTime(2.0);
        pageMonitorVO.setMaxTime(3.0);
        //根据条件查询加载时段为3s-5s所有数据信息
        List<PageMonitorInfo> pageMonitorInfoList3 = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        pageMonitorVO.setMinTime(3.0);
        pageMonitorVO.setMaxTime(5.0);
        //根据条件查询加载时段为5s以上所有数据信息
        List<PageMonitorInfo> pageMonitorInfoList4 = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        pageMonitorVO.setMinTime(5.0);
        pageMonitorVO.setMaxTime(null);
        List<PageMonitorInfo> pageMonitorInfoList5 = pageMonitorMapper.getMessageInfoListPage(pageMonitorVO);
        //ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("classpath:elasticsearch.xml");  
        //ElasticsearchIndexService service = context1.getBean(ElasticsearchIndexService.class);  
        //删除rhino索引
        ElasticsearchIndexService services = new ElasticsearchIndexService();
        services.deleteIndex(Constants.H5Page_INDEX_NAME);
        try {
            //创建rhino索引下的h5_page_monitor类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_ALL);
            //创建rhino索引下的h5_page_monitor_1类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_1);
            //创建rhino索引下的h5_page_monitor_2类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_2);
            //创建rhino索引下的h5_page_monitor_3类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_3);
            //创建rhino索引下的h5_page_monitor_4类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_4);
            //创建rhino索引下的h5_page_monitor_5类型
            service.create(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_5);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        if(pageMonitorInfoList != null && pageMonitorInfoList.size() != 0){
            //在rhino索引下的h5_page_monitor类型批量插入数据
            boolean insert = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_ALL, pageMonitorInfoList);
            logger.info("在rhino索引下的h5_page_monitor类型批量插入数据:"+insert);
        }
        if(pageMonitorInfoList1 != null && pageMonitorInfoList1.size() != 0){
            //在rhino索引下的h5_page_monitor_1类型批量插入数据
            boolean insert1 = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_1, pageMonitorInfoList1);
            logger.info("在rhino索引下的h5_page_monitor_1类型批量插入数据:"+insert1);
        }
        if(pageMonitorInfoList2 != null && pageMonitorInfoList2.size() != 0){
            //在rhino索引下的h5_page_monitor_2类型批量插入数据
            boolean insert2 = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_2, pageMonitorInfoList2);
            logger.info("在rhino索引下的h5_page_monitor_2类型批量插入数据:"+insert2);
        }
        if(pageMonitorInfoList3 != null && pageMonitorInfoList3.size() != 0){
            //在rhino索引下的h5_page_monitor_3类型批量插入数据
            boolean insert3 = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_3, pageMonitorInfoList3);
            logger.info("在rhino索引下的h5_page_monitor_3类型批量插入数据:"+insert3);
        }
        if(pageMonitorInfoList4 != null && pageMonitorInfoList4.size() != 0){
            //在rhino索引下的h5_page_monitor_4类型批量插入数据
            boolean insert4 = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_4, pageMonitorInfoList4);
            logger.info("在rhino索引下的h5_page_monitor_4类型批量插入数据:"+insert4);
        }
        if(pageMonitorInfoList5 != null && pageMonitorInfoList5.size() != 0){
            //在rhino索引下的h5_page_monitor_5类型批量插入数据
            boolean insert5 = service.insertOrUpdatePageMonitorInfo(Constants.H5Page_INDEX_NAME,Constants.H5Page_TYPE_NAME_Period_5, pageMonitorInfoList5);
            logger.info("在rhino索引下的h5_page_monitor_5类型批量插入数据:"+insert5);
        }
    }
    
    
    /**
     * 返回前七天日期
     * @return
     */
    public PageMonitorVO getPageMonitorVO(){
        Date date0=new Date();
        SimpleDateFormat formatter1 = new SimpleDateFormat("MM/dd/yyyy");
        Calendar calendar1 = new GregorianCalendar();
        calendar1.setTime(date0);
        calendar1.add(calendar1.DATE,-1);
        Date date1=calendar1.getTime();
        String dateStr1 = formatter1.format(date1);
        calendar1.add(calendar1.DATE,-6);
        date1=calendar1.getTime();
        String dateStr2 = formatter1.format(date1);
        String dateStr = dateStr2 + " - " + dateStr1;
        PageMonitorVO pageMonitorVO = new PageMonitorVO();
        pageMonitorVO.setChooseTimeVO(dateStr);
        if(pageMonitorVO.getChooseTimeVO()!=null){
            String[] split = pageMonitorVO.getChooseTimeVO().split("-");
            DateTimeFormatter formater = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
            Date startDate = DateTime.parse(split[0].trim()+ " 00:00:00", formater).toDate();
            Date endDate = DateTime.parse(split[1].trim()+ " 23:59:59", formater).toDate();
            pageMonitorVO.setStart_date(startDate);
            pageMonitorVO.setEnd_date(endDate);
        }else{
            pageMonitorVO.setStart_date(null);
            pageMonitorVO.setEnd_date(null);
        }
        return pageMonitorVO;
    }

}
